中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

c語言合并兩個有序鏈表的方法是什么

小億
99
2023-12-01 22:24:42
欄目: 編程語言

合并兩個有序鏈表的方法是使用雙指針來比較兩個鏈表的節點值,然后按照順序將節點連接起來。

具體步驟如下:

  1. 定義一個新的鏈表頭節點指針newHead,并且定義一個指針指向它,用于后續的節點的連接。
  2. 定義兩個指針指向兩個有序鏈表的頭節點,分別命名為p1和p2,初始化為鏈表1和鏈表2的頭節點。
  3. 遍歷鏈表1和鏈表2,比較p1和p2指向節點的值: a. 若p1的值小于等于p2的值,則將p1指向的節點連接到newHead后面,并且將p1指針后移一位。 b. 若p1的值大于p2的值,則將p2指向的節點連接到newHead后面,并且將p2指針后移一位。
  4. 當其中一個鏈表遍歷完畢后,將另一個鏈表剩余部分直接連接到newHead后面。
  5. 返回newHead的下一個節點,即為合并后的有序鏈表的頭節點。

代碼示例:

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int val;
    struct ListNode *next;
};

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
    struct ListNode* newHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* p = newHead;

    struct ListNode* p1 = l1;
    struct ListNode* p2 = l2;

    while (p1 && p2) {
        if (p1->val <= p2->val) {
            p->next = p1;
            p1 = p1->next;
        } else {
            p->next = p2;
            p2 = p2->next;
        }
        p = p->next;
    }

    if (p1) {
        p->next = p1;
    }

    if (p2) {
        p->next = p2;
    }

    return newHead->next;
}

int main() {
    // 創建鏈表1: 1 -> 2 -> 4
    struct ListNode* l1 = (struct ListNode*)malloc(sizeof(struct ListNode));
    l1->val = 1;
    l1->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    l1->next->val = 2;
    l1->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    l1->next->next->val = 4;
    l1->next->next->next = NULL;

    // 創建鏈表2: 1 -> 3 -> 4
    struct ListNode* l2 = (struct ListNode*)malloc(sizeof(struct ListNode));
    l2->val = 1;
    l2->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    l2->next->val = 3;
    l2->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));
    l2->next->next->val = 4;
    l2->next->next->next = NULL;

    // 合并兩個有序鏈表
    struct ListNode* mergedList = mergeTwoLists(l1, l2);

    // 輸出合并后的鏈表:1 -> 1 -> 2 -> 3 -> 4 -> 4
    while (mergedList) {
        printf("%d ", mergedList->val);
        mergedList = mergedList->next;
    }

    return 0;
}

輸出結果: 1 1 2 3 4 4

0
峨边| 肥乡县| 洛宁县| 辽源市| 马鞍山市| 淮阳县| 闸北区| 余江县| 南通市| 太仓市| 潼关县| 蛟河市| 沅江市| 太谷县| 灌阳县| 赞皇县| 玉环县| 德昌县| 澜沧| 莎车县| 阿鲁科尔沁旗| 东兰县| 鄂州市| 十堰市| 常州市| 松原市| 通道| 青铜峡市| 德江县| 郧西县| 武安市| 额敏县| 清远市| 手游| 庆阳市| 广宁县| 东光县| 桐梓县| 交口县| 枝江市| 古浪县|