1. 程式人生 > >七、兩個有序連結串列合併(遞迴方式)

七、兩個有序連結串列合併(遞迴方式)

/**
 * 合併兩個有序連結串列,合併後依舊有序,當連結串列1是空連結串列時,合併結果就是連結串列2,但連結串列2是空連結串列時,
 * 合併結果是連結串列1;如果兩都是空連結串列,合併結果就是空連結串列;
 * 比較兩個連結串列的頭結點,小的作為合併後的頭結點,在剩餘節點中,再次比較兩個連結串列的頭結點(採用遞迴)。
 */
struct list_head *merge_two_list(struct list_head *list_one, struct list_head *list_two)
{
    struct list_head *new_head = NULL;

    /*連結串列1為空*/
    if (!list_one)
        return list_two;

    /*連結串列2為空*/
    if (!list_two)
        return list_one;

    /*連結串列1頭結點的值 小於 連結串列2頭結點的值*/
    if (list_one->data < list_two->data) {
        new_head = list_one;    /*連結串列1頭結點作為新連結串列的頭結點*/
        new_head->next = merge_two_list(list_one->next, list_two);
    } else {     /*連結串列2頭結點的值 小於 連結串列1頭結點的值*/
        new_head = list_two;
        new_head->next = merge_two_list(list_one, list_two->next);
    }

    return new_head;    /*返回新連結串列的頭結點*/
}