题目描述
将两个有序的链表重新合并为一个新的有序链表
题目链接
思路:首先将两个链表中第一个结点值较小的作为合成新链表的首结点,即phead指向这个较小的结点,之后我们使用一个结点指针pc连接两个链表,将两个链表重新组合,其实这里的pc就相当于一个“针”,把两个链表连接起来,非常巧妙!!!
代码如下
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode * pc;
struct ListNode * phead = NULL;
struct ListNode * p1 = l1;
struct ListNode * p2 = l2;
//首先判断传入链表是否存在
if(!p1)
return p2;
if(!p2)
return p1;
if(!p1 && !p2)
return NULL;
//这里就需要确定新链表的头结点,选择较小的结点
if(p1->val <= p2->val)
{
phead = p1;
p1 = p1->next;
}
else
{
phead = p2;
p2 = p2->next;
}
//pc指针开始指向新链表的头结点,开始连接另外两个链表
pc = phead;
while(p1 && p2 && pc)
{
//如何1号链表上的结点小于2号链表结点,那么就让pc连接这个较小的结点
if(p1->val <= p2->val)
{
pc->next = p1;
pc = p1;
p1 = p1->next;
}
else
{
pc->next = p2;
pc = p2;
p2 = p2->next;
}
}
//如果1、2还存在结点,就让pc去连接在新链表后面
if(p1)
pc->next = p1;
if(p2)
pc->next = p2;
return phead;
}