题解 | #合并两个排序的链表#
合并两个排序的链表
https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337
//这题由于限制了空间复杂度为O1,因此最简单粗暴的办法,把两个链表遍历一边,所有值拿出来,存进数组,排序,建一个新链表,这种思路是不行的。我们只能在原地构建一个新链表——其实就是把几个指针大家挪来挪去,你指我指你。 //思路上借鉴了之前的反转链表的题解,想象成我们建了一个新的链表,然后把旧链表上的节点一个个“拆”下来,放到新链表上去。 class Solution { public: ListNode* Merge(ListNode* pHead1, ListNode* pHead2) { ListNode* p1=pHead1; ListNode* p2=pHead2; ListNode* newList=new ListNode(0);//构造一个出来。不然空指针指向的空对象,也是没有成员对象next的。另外newList的存在主要是为了记录新链表的入口。 ListNode* current=newList; while (p1 && p2) { if(p1->val > p2->val) { current->next=p2;//将current指向更小的那个节点,并移动current current=current->next; p2=p2->next;//移动p1 }else { current->next=p1; current=current->next; p1=p1->next; } } current->next=p1? p1:p2;//剩下的直接整段接上去就行了。 return newList->next; } };