合併兩個非遞減單鏈表,結果只輸出第一個結點。
p->next = L->next;
L->next = p;
導致鏈表順序與輸入順序相反(輸入 1,2,3 → 鏈表 3,2,1),不再是非遞減序列,合併邏輯失效。m、n 個結點后直接拼接剩余部分,未真正歸併排序。// 尾插法建表,保持輸入順序
void CreateList(LinkList &L, int n) {
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
LinkList tail = L;
for (int i=0; idata); // 空格跳過換行
p->next = NULL;
tail->next = p;
tail = p;
}
}
// 歸併兩有序鏈表(去重)
void MergeList(LinkList La, LinkList Lb, LinkList &Lc) {
Lc = (LinkList)malloc(sizeof(LNode));
LinkList pc = Lc, pa = La->next, pb = Lb->next;
while (pa && pb) {
if (pa->data < pb->data) {
pc->next = pa; pa = pa->next;
} else if (pa->data > pb->data) {
pc->next = pb; pb = pb->next;
} else { // 相等,取一個,雙方都前進
pc->next = pa; pa = pa->next; pb = pb->next;
}
pc = pc->next;
}
pc->next = pa ? pa : pb; // 接上剩余部分
}
tail 指針,時間複雜度 O(1) 插入。