解题思路
1.注意链表为空的情况,此时传入的结构体节点指针指向的为NULL,即节点不存在;并且此处的链表是没有头节点的,因此空表不是头节点的Next域为空,而是节点指针为空。
2.其中合成新链表可以以原链表的第一个节点为开始,无需重新malloc新空间。
3.在操作链表时,通常让一个指针指向链表的头节点或第一个节点,并且保持其不动,用来存储链表的地址,然后再用其赋值给另外一个指针,这个指针用来对链表进行操作。此处共有两个链表就是用l1和l2来储存的,然后三个指针pa,pb,pc用来操作三个链表,操作完后直接返回l1,l2即可。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
struct ListNode *pa = l1;
struct ListNode *pb = l2;
if(!pa)
return l2;
else if(!pb)
return l1;
else
{
if(pa->val <= pb->val)
{
struct ListNode *pc = l1;
pa = pa->next;
while(pa && pb)
{
if(pa->val <= pb->val)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
return l1;
}
else
{
struct ListNode *pc = l2;
pb = pb->next;
while(pa && pb)
{
if(pa->val <= pb->val)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc = pb;
pb = pb->next;
}
}
pc->next = pa ? pa : pb;
return l2;
}
}
}