前言
链表作为数据结构的基础,指针操作灵活但逻辑构建要求高。本文将通过三个经典案例,拆解链表的核心操作技巧。
一、合并两个有序链表
1.1 题目

1.2 算法原理
核心思路是比较大小并逐个插入,同时建立一个哨兵位(Dummy Head)。
定义四个指针:newhead 和 newtail 用于新链表的头尾,pcur1 和 pcur2 分别指向待合并的两个链表头部。使用哨兵位可以免去链表为空时的特殊判断,最后返回 newhead->next 即可。
1.3 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
ListNode* newhead = (ListNode*)malloc(sizeof(ListNode));
ListNode* pcur1 = list1;
ListNode* pcur2 = list2;
ListNode* newtail = newhead;
newtail->next = NULL;
while (pcur1 && pcur2) {
if (pcur1->val <= pcur2->val) {
newtail->next = pcur1;
newtail = newtail->next;
pcur1 = pcur1->next;
} else {
newtail->next = pcur2;
newtail = newtail->next;
pcur2 = pcur2->next;
}
}
if (pcur1) newtail->next = pcur1;
if (pcur2) newtail->next = pcur2;
return newhead->next;
}
注意:在工程实践中,手动
malloc的空间应及时释放。但在算法题中,通常由运行环境自动回收,此处重点讲解逻辑。





