剑指OFFER——合并两个有序的链表

时间:2023-03-08 22:17:50

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

再做这道题就是想不起来书上怎么做的了,但是最近看STL里面全是这种基础的合并啊,比较啊。就算不会也看会了。

循环我用了4个指针。p和q分别指向两个链表当前需要比较的元素,l和k分别代表“新”的链表的旧节点和新节点,防止断了。

每次新比较的结果给k,l代表之前的节点。

循环:

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1==NULL||pHead2==NULL){
if(pHead2==NULL)
return pHead1;
else return pHead2;}
ListNode *p=pHead1,*q=pHead2;
pHead1= pHead1->val<pHead2->val? pHead1:pHead2;
ListNode *k=pHead1,*l=pHead1;
while(p!=NULL&&q!=NULL){
if(p->val < q->val){
k=p;
p=p->next;
}
else {
k=q;
q=q->next;
}
l->next=k;
l=k;
}
if(q==NULL)
l->next=p;
if(p==NULL)
l->next=q;
return pHead1;
}
};

递归:

public class Solution {
public ListNode Merge(ListNode list1, ListNode list2) {
if(list1==null)
return list2;
else if(list2==null)
return list1;
ListNode mergeHead=null;
if(list1.val<list2.val){
mergeHead=list1;
mergeHead.next=Merge(list1.next, list2);
}
else{
mergeHead=list2;
mergeHead.next=Merge(list1, list2.next);
}
return mergeHead; }
}