fork download
  1. program ideone;
  2.  
  3. {$MODE OBJFPC}{$LONGSTRINGS ON}
  4.  
  5. type
  6. PNode = ^TNode;
  7. TNode = record
  8. Data: UInt8;
  9. Next: PNode;
  10. end;
  11.  
  12. function CreateList(ASize: Integer; AData: array of UInt8): PNode;
  13. var
  14. LHead, LNode: PNode;
  15. LIndex: UInt8 = 0;
  16. begin
  17. New(LHead);
  18. LHead^.Data := AData[LIndex];
  19. LHead^.Next := nil;
  20.  
  21. Result := LHead;
  22. Inc(LIndex);
  23.  
  24. while LIndex < ASize do
  25. begin
  26. New(LNode);
  27. LNode^.Data := AData[LIndex];
  28. LNode^.Next := nil;
  29.  
  30. LHead^.Next := LNode;
  31. LHead := LNode;
  32.  
  33. Inc(LIndex);
  34. end;
  35. end;
  36.  
  37. function MergeLists(ALeft, ARight: PNode): PNode;
  38. var
  39. LLast: PNode;
  40. begin
  41. if ALeft = nil then Exit(ARight);
  42. if ARight = nil then Exit(ALeft);
  43.  
  44. if ALeft^.Data < ARight^.Data then
  45. begin
  46. LLast := ALeft;
  47. ALeft := ALeft^.Next;
  48. end
  49. else
  50. begin
  51. LLast := ARight;
  52. ARight := ARight^.Next;
  53. end;
  54.  
  55. Result := LLast;
  56.  
  57. while (ALeft <> nil) and (ARight <> nil) do
  58. begin
  59. if ALeft^.Data < ARight^.Data then
  60. begin
  61. LLast^.Next := ALeft;
  62. ALeft := ALeft^.Next;
  63. end
  64. else
  65. begin
  66. LLast^.Next := ARight;
  67. ARight := ARight^.Next;
  68. end;
  69.  
  70. LLast := LLast^.Next;
  71. end;
  72.  
  73. if ALeft <> nil then
  74. LLast^.Next := ALeft
  75. else
  76. LLast^.Next := ARight;
  77. end;
  78.  
  79. procedure ShowList(AHead: PNode);
  80. begin
  81. while AHead <> nil do
  82. begin
  83. Write(AHead^.Data:3);
  84. AHead := AHead^.Next;
  85. end;
  86.  
  87. WriteLn();
  88. end;
  89.  
  90. var
  91. LLeft, LRight, LMerged: PNode;
  92. begin
  93. Randomize();
  94.  
  95. LLeft := CreateList(5, [0, 4, 5, 6, 11]);
  96. LRight := CreateList(9, [1, 2, 3, 5, 7, 8, 9, 10, 12]);
  97.  
  98. ShowList(LLeft);
  99. ShowList(LRight);
  100.  
  101. WriteLn();
  102.  
  103. LMerged := MergeLists(LLeft, LRight);
  104. ShowList(LMerged);
  105. end.
  106.  
Success #stdin #stdout 0s 320KB
stdin
Standard input is empty
stdout
  0  4  5  6 11
  1  2  3  5  7  8  9 10 12

  0  1  2  3  4  5  5  6  7  8  9 10 11 12