将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->
适用于两个无头节点的的两个链表。建立了一个头节点用来指引新链表。因为不知道L1与L2两个链表的首元素哪个小。
P、Q分别是L1和L2的遍历指针,另外用一个S指针作为新链表的尾指针,R指针作过渡指针指向P或Q当前元素的后一个节点,
因为结果是递增顺序的链表,所以采用尾插法进行插入。
如果出现P、Q中一个提前为空,还要把另一指针的接到S指针后面。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
//申请一个新的头结点,用来指引新的链表。
struct ListNode* h = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode* p,*q,*r,*s;
h->next==NULL;
p=l1;q=l2;s=h;
while(p&&q){
if(p->val<=q->val){
r=p->next;
s->next=p; //采用尾插法
s=p;
p=r;
}else{
r=q->next;
s->next=q;
s=q;
q=r;
}
}
if(p==NULL){
s->next=q; //将L2中剩余元素接到新链表后面,即S指针后。
}
if(q==NULL){
s->next=p; //将L1中剩余元素接到新链表后面,即S指针后。
}
return h->next;
}