mergeTwoLists c++写法指针问题
如下的代码可以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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你说的“内容”指啥?
val
?next
?你确实没有改
val
,但是改了next
。不拷贝的情况下。把两个链表合并了肯定会改变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