mergeTwoLists c++写法指针问题

发布于 2022-09-11 23:05:16 字数 1157 浏览 15 评论 0

如下的代码可以leetcode AC,但是传入的l1和l2内容却被改变了,我不是非常理解。

因为我自己定义了两个指针p1,p2,这两个指针同l1,l2指向同样的节点,为什么我只是移动p1,p2,没有改变其中的内容,但是传入的l1和l2内容变化了?

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    ListNode dummy = ListNode(-1);
    ListNode *pDummy = &dummy;
    ListNode *p1 = l1;
    ListNode *p2 = l2;
    while (p1 && p2) {
        if (p1->val <= p2->val) {
            pDummy->next = p1;
            p1 = p1->next;
        } else {
            pDummy->next = p2;
            p2 = p2->next;
        }
        pDummy = pDummy->next;
    }
    pDummy->next = p1 != NULL ? p1 : p2;
    // 到这里题目就做完了,接下来输出l1,l2,发现他们已经改变,为什么会变?
    ListNode *p11 = l1;
    ListNode *p22 = l2;
    while (p11) {
         printf("val %d \n", p11->val);
         p11 = p11->next;
     }
    while (p22) {
        printf("val %d \n", p22->val);
        p22 = p22->next;
    }
    return dummy.next;
}
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

玩心态 2022-09-18 23:05:16

你说的“内容”指啥?valnext

你确实没有改 val ,但是改了 next

情场扛把子 2022-09-18 23:05:16

不拷贝的情况下。把两个链表合并了肯定会改变l1 l2结构的,不然怎么叫合并。不变只是l1 l2指向的头节点。
比如l1: l10-l11-l12, l2: l20-l21-l22
假设合并后: l10-l20-l11-l21-l12-l22
不变的:
l1指向的是原来的头节点l10,l2指向的是原来的头节点l20
变的:
l1链表变成了l10-l20-l11-l21-l12-l22
l2链表变成了l20-l11-l21-l12-l22

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文